package main

import "fmt"

// 本质是一个指针
type Animal interface {
	Sleep()
	GetColor() string // 获取动物颜色
	GetType() string  // 获取动物的种类
}

/*唐渝鹏*/

// 具体的类
type Cat struct {
	color string // 猫的颜色
}

func (this *Cat) Sleep() {
	fmt.Println("Cat is sleeping...")
}

func (this *Cat) GetColor() string {
	return this.color
}

func (this *Cat) GetType() string {
	return "Cat"
}

// 具体的类
type Dog struct {
	color string // dog的颜色
}

func (this *Dog) Sleep() {
	fmt.Println("Dog is sleeping...")
}

func (this *Dog) GetColor() string {
	return this.color
}

func (this *Dog) GetType() string {
	return "Dog"
}

func showAnimal(animal Animal) {
	animal.Sleep() // 多态
	fmt.Println("color = ", animal.GetColor())
	fmt.Println("type = ", animal.GetType())
}

func main() {
	var animal Animal // 接口的数据类型， 父类指针
	animal = &Cat{"white"}

	animal.Sleep() // 调用的就是Cat的Sleep() 方法，多态的现象

	animal = &Dog{"black"}
	animal.Sleep() // 调用的就是Dog的Sleep() 方法，多态的现象

	cat := Cat{"yellow"}
	dog := Dog{"black"}

	showAnimal(&cat)
	showAnimal(&dog)

}
